package com.example.mq.common;

import java.io.*;

/**
 * 序列化和反序列化
 * 下列的逻辑不仅仅是Message,其他的java对象都可以通过这样的逻辑进行序列化和反序列化
 * 如果想让这个java对象实现序列化和反序列化，需要实现 Serializable 接口（java标准库要求）
 */
public class BinaryTool {
    //把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //这个流对象相当于 变长 的字节数组
        //就可以把object序列化的数据给逐渐的写入byteArrayOutputStream中，在统一转成byte[]
        try(ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream)){
                //此处的 writeObject就会把对象进行序列化，生成二进制数据，写入到 objectOutputStream中
                //由于 objectOutputStream优势关联到了 ByteArrayOutputStream，最终结果写入到 ByteArrayOutputStream了
                objectOutputStream.writeObject(object);
            }
            //此处就是把 byteArrayOutputStream中持有的二进制数据取出来,转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    //把一个字节数组，反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object=null;
        try(ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream)){
                //此处的 readObject就是从 data这个 byte[]中读取数据并进行反序列化
                object=objectInputStream.readObject();
            }
        }
        return object;
    }
}
